#!/bin/bash
# 安全修复脚本 - 解决敏感信息泄露问题

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

print_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

print_banner() {
    echo "============================================================"
    echo "🔒 安全修复脚本 - 解决敏感信息泄露问题"
    echo "============================================================"
    echo "修复时间: $(date '+%Y-%m-%d %H:%M:%S')"
    echo "============================================================"
}

# 1. 创建环境变量文件
create_env_file() {
    print_info "创建环境变量文件..."
    
    if [ -f ".env" ]; then
        print_warning ".env 文件已存在，是否覆盖? (y/n)"
        read -r overwrite
        if [[ ! $overwrite =~ ^[Yy]$ ]]; then
            print_info "跳过 .env 文件创建"
            return
        fi
    fi
    
    cat > .env << 'EOF'
# API配置
API_KEY=your_api_key_here
BASE_URL=https://maas-api.lanyun.net/v1
MODEL=/maas/qwen/Qwen3-235B-A22B

# 邮箱配置
SENDER_EMAIL=your_email@qq.com
SENDER_PASSWORD=your_auth_code_here
RECIPIENT_EMAIL=505735255@qq.com

# RSS配置
RSS_URL=https://rss.aishort.top/?type=36kr

# 定时任务配置
SEND_TIME=08:00
MAX_NEWS_ITEMS=8

# 其他配置
ENABLE_LOGGING=true
LOG_DIR=logs
ENABLE_RETRY=true
MAX_RETRY_COUNT=3
RETRY_INTERVAL=300
EOF
    
    chmod 600 .env
    print_success ".env 文件创建完成"
}

# 2. 更新.gitignore
update_gitignore() {
    print_info "更新 .gitignore 文件..."
    
    if [ ! -f ".gitignore" ]; then
        touch .gitignore
    fi
    
    # 检查是否已经包含敏感文件规则
    if ! grep -q "\.env" .gitignore; then
        cat >> .gitignore << 'EOF'

# 敏感文件
.env
email_config.py
*.log
logs/
backups/
task_state.json
data/

# Python缓存
__pycache__/
*.pyc
*.pyo
*.pyd
.Python
venv/
.venv/
.pytest_cache/

# 系统文件
.DS_Store
Thumbs.db
EOF
        print_success ".gitignore 文件已更新"
    else
        print_info ".gitignore 文件已包含敏感文件规则"
    fi
}

# 3. 创建配置模板
create_config_template() {
    print_info "创建配置模板..."
    
    if [ -f "email_config.py" ]; then
        cp email_config.py email_config.py.template
        print_success "配置模板创建完成"
    else
        print_warning "email_config.py 文件不存在，跳过模板创建"
    fi
}

# 4. 创建安全配置加载器
create_config_loader() {
    print_info "创建安全配置加载器..."
    
    cat > secure_config.py << 'EOF'
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
安全配置加载器
从环境变量和配置文件加载配置，避免敏感信息泄露
"""

import os
from typing import Dict, Any, List

class SecureConfig:
    """安全配置管理器"""
    
    def __init__(self):
        self.config = {}
        self.load_config()
    
    def load_config(self):
        """加载配置"""
        # 从环境变量加载
        self.config.update({
            "api_key": os.getenv("API_KEY"),
            "base_url": os.getenv("BASE_URL", "https://maas-api.lanyun.net/v1"),
            "model": os.getenv("MODEL", "/maas/qwen/Qwen3-235B-A22B"),
            "sender_email": os.getenv("SENDER_EMAIL"),
            "sender_password": os.getenv("SENDER_PASSWORD"),
            "recipient_email": os.getenv("RECIPIENT_EMAIL", "505735255@qq.com"),
            "rss_url": os.getenv("RSS_URL", "https://rss.aishort.top/?type=36kr"),
            "send_time": os.getenv("SEND_TIME", "08:00"),
            "max_news_items": int(os.getenv("MAX_NEWS_ITEMS", "8")),
            "enable_logging": os.getenv("ENABLE_LOGGING", "true").lower() == "true",
            "log_dir": os.getenv("LOG_DIR", "logs"),
            "enable_retry": os.getenv("ENABLE_RETRY", "true").lower() == "true",
            "max_retry_count": int(os.getenv("MAX_RETRY_COUNT", "3")),
            "retry_interval": int(os.getenv("RETRY_INTERVAL", "300"))
        })
        
        # 从配置文件加载（如果存在）
        if os.path.exists("email_config.py"):
            try:
                import email_config
                # 只加载非敏感配置
                if hasattr(email_config, 'RSS_URL'):
                    self.config["rss_url"] = email_config.RSS_URL
                if hasattr(email_config, 'SEND_TIME'):
                    self.config["send_time"] = email_config.SEND_TIME
                if hasattr(email_config, 'MAX_NEWS_ITEMS'):
                    self.config["max_news_items"] = email_config.MAX_NEWS_ITEMS
            except ImportError:
                pass
    
    def validate_config(self) -> List[str]:
        """验证配置"""
        errors = []
        required_fields = ["api_key", "sender_email", "sender_password"]
        
        for field in required_fields:
            if not self.config.get(field):
                errors.append(f"缺少必要配置: {field}")
        
        # 验证邮箱格式
        if self.config.get("sender_email") and "@" not in self.config["sender_email"]:
            errors.append("发送邮箱格式不正确")
        
        if self.config.get("recipient_email") and "@" not in self.config["recipient_email"]:
            errors.append("接收邮箱格式不正确")
        
        return errors
    
    def get_config(self) -> Dict[str, Any]:
        """获取配置"""
        return self.config.copy()
    
    def get_api_config(self) -> Dict[str, str]:
        """获取API配置"""
        return {
            "api_key": self.config["api_key"],
            "base_url": self.config["base_url"],
            "model": self.config["model"]
        }
    
    def get_email_config(self) -> Dict[str, str]:
        """获取邮箱配置"""
        return {
            "sender_email": self.config["sender_email"],
            "sender_password": self.config["sender_password"],
            "recipient_email": self.config["recipient_email"]
        }

# 全局配置实例
config = SecureConfig()

# 兼容性接口
API_CONFIG = config.get_api_config()
SYSTEM_PROMPTS = {
    "assistant": "你是一个有用的AI助手，请用简洁明了的方式回答问题。",
    "programmer": "你是一个专业的Python编程助手，请用简洁明了的方式回答问题。",
    "teacher": "你是一个耐心的老师，请用通俗易懂的方式解释复杂的概念。",
    "creative": "你是一个富有创意的写作助手，请用生动有趣的方式回答问题。"
}

if __name__ == "__main__":
    # 配置验证
    errors = config.validate_config()
    
    if errors:
        print("❌ 配置验证失败:")
        for error in errors:
            print(f"  - {error}")
        print("\n请检查 .env 文件中的配置")
    else:
        print("✅ 配置验证通过")
        print("\n当前配置:")
        cfg = config.get_config()
        for key, value in cfg.items():
            if "password" in key.lower() or "key" in key.lower():
                print(f"  {key}: {'*' * len(str(value))}")
            else:
                print(f"  {key}: {value}")
EOF
    
    print_success "安全配置加载器创建完成"
}

# 5. 创建备份目录
create_backup_dirs() {
    print_info "创建备份目录..."
    
    mkdir -p backups
    mkdir -p logs
    mkdir -p data
    
    print_success "备份目录创建完成"
}

# 6. 显示修复结果
show_results() {
    print_success "安全修复完成！"
    echo ""
    echo "============================================================"
    echo "📋 修复内容"
    echo "============================================================"
    echo "✅ 创建了 .env 环境变量文件"
    echo "✅ 更新了 .gitignore 文件"
    echo "✅ 创建了配置模板"
    echo "✅ 创建了安全配置加载器"
    echo "✅ 创建了备份目录"
    echo ""
    echo "============================================================"
    echo "🔧 下一步操作"
    echo "============================================================"
    echo "1. 编辑 .env 文件，填入您的实际配置信息："
    echo "   nano .env"
    echo ""
    echo "2. 更新代码以使用新的配置加载器："
    echo "   # 将 'from config import API_CONFIG' 改为"
    echo "   # 'from secure_config import API_CONFIG'"
    echo ""
    echo "3. 测试配置是否正常："
    echo "   python secure_config.py"
    echo ""
    echo "4. 提交代码（敏感信息已自动排除）："
    echo "   git add ."
    echo "   git commit -m 'Security fix: Move sensitive data to environment variables'"
    echo ""
    echo "============================================================"
    echo "⚠️  重要提醒"
    echo "============================================================"
    echo "- 请勿将 .env 文件提交到版本控制系统"
    echo "- 定期更换API密钥和邮箱授权码"
    echo "- 确保 .env 文件权限设置为 600"
    echo "- 在生产环境中使用更安全的密钥管理方案"
    echo "============================================================"
}

# 主函数
main() {
    print_banner
    
    create_env_file
    update_gitignore
    create_config_template
    create_config_loader
    create_backup_dirs
    show_results
}

# 运行主函数
main "$@"
